
public class CuentaBancaria {
	private String titular, entidad, oficina, DC, numCuenta;
//	private String CCC = entidad + oficina + DC + numCuenta;
	public static final int NOMMAX = 100, NOMMIN = 10;
	private double saldo;	
	
	//Constructor basico
	public CuentaBancaria (String titular, String entidad, String oficina, String DC, String numCuenta) {
		this.setTitular(titular);
		if (CuentaBancaria.comprobarCCC(entidad + oficina + DC + numCuenta) == true) {
			this.DC = DC;
		}
		else {
			System.out.println("Los digitos de control son invalidos");
		}
		if (entidad.length() == 4) {
			this.entidad = entidad;
		}
		else {
			System.out.println("El numero de entidad debe tener 4 digitos");
		}
		if (oficina.length() == 4) {
			this.oficina = oficina;
		}
		else {
			System.out.println("El numero de oficina debe tener 4 digitos");
		}
		if (DC.length() == 2) {
			this.DC = DC;
		}
		else {
			System.out.println("El digito de control debe tener 2 numeros");
		}
		if (numCuenta.length() == 10) {		
			this.numCuenta = numCuenta;
		}
		else {
			System.out.println("El numero de cuenta debe tener 10 digitos");
		}		
	}
	
	//Constructor que descompone un CCC y llama al primer constructor 
	public CuentaBancaria (String tit, String CCC) {
		this (tit, CCC.substring(0, 4), CCC.substring(4, 8), CCC.substring(8, 10), CCC.substring(10, 20));			
	}
	
	//SETTERS
	public void setTitular (String titular) {
		if (titular.length() < this.getNOMMIN() || titular.length() > this.getNOMMAX()) {
			System.out.println("El nombre del titular debe tener entre 10 y 100 caracteres");
		}
		else {
			this.titular = titular;
		}
	}
	
	public void ingresar (double ingr) {
		if (ingr <= 0) {
			System.out.println("El saldo a introducir debe ser positivo");
		}
		else {
			saldo += ingr;
		}
	}
	
	public void retirar (double ret) {
		if (ret <= 0) {
			System.out.println("El saldo a retirar debe ser positivo");
		}
		else {
			if (ret > saldo) {
				System.out.println("No puedes retirar mas dinero del que tienes");
			}
			else {
				saldo -= ret;
			}
		}
	}
	
	//GETTERS
	public String getTitular () {
		return this.titular;
	}
	
	public double getSaldo () {
		return this.saldo;
	}
	
	public String toString () {
		return entidad+"-" + oficina+"-" + DC+"-" + numCuenta;
	}
	
	public String getEntidad () {
		return this.entidad;
	}
	
	public String getOficina () {
		return this.oficina;
	}
	
	public String getDC () {
		return this.DC;
	}
	
	public String getNumCuenta () {
		return this.numCuenta;
	}
	
	public int getNOMMIN () {
		return NOMMIN;
	}
	
	public int getNOMMAX () {
		return NOMMAX;
	}
	
	//Metodo para comprobar validez de los DC de una cuenta
	public static boolean comprobarCCC (String CCC) {
		boolean valido = false;
		if (CCC.length() != 20) {
			System.out.println("El numero de cuenta debe tener 20 digitos");
		}
		else {
			if (CuentaBancaria.obtenerDigitosControl(CCC.substring(0, 4), CCC.substring(4, 8), CCC.substring(10, 20)).equals(CCC.substring(8, 10))) {
				valido = true;
			}
			else {
				valido = false;
			}
		}
		return valido;		
	}
	
	//Metodo para obtener los DC de una cuenta
	public static String obtenerDigitosControl (String ent, String ofi, String numC) {
		String cadena1 = "00" + ent + ofi, dC = "";
		int valor;
		int multiplicadores[] = {1, 2, 4, 8, 5, 10, 9, 7, 3, 6};
		int result, suma = 0;
		for (int i = 0; i < 10; i++) {
			result = cadena1.charAt(i) * multiplicadores[i];
			suma += result; 
		}
		valor = suma % 11;
		valor = 11 - valor;
		if (valor == 10) {
			dC += "1";
		}
		else {
			if (valor == 11) {
				dC += "0";
			}
			else {
				dC += String.valueOf(valor);
			}
		}
		suma = 0;
		for (int i = 0; i < 10; i++) {
			result = numC.charAt(i) * multiplicadores[i];
			suma += result; 
		}
		valor = suma % 11;
		valor = 11 - valor;
		if (valor == 10) {
			dC += "1";
		}
		else {
			if (valor == 11) {
				dC += "0";
			}
			else {
				dC += String.valueOf(valor);
			}
		}
		return dC;		
	}	
}
